package userapi

import (
	"fmt"
	"ginweb/DB_operation"
	. "ginweb/model/error_admin"
	"ginweb/model/token"
	"github.com/gin-gonic/gin"
	"net/http"
)

/*
它代表了客户端和服务器之间的一次请求/响应的上下文（context）。
它封装了请求（Request）和响应（Response）对象，
以及一些用于处理请求的中间件、路由参数、键值对（用于在请求的生命周期内传递数据）等信息。
例如:
Param(name string) string：根据参数名获取URL中的参数值。
Query(key string) string：获取URL查询字符串中的参数值。
PostForm(key string) string：获取表单中的字段值，仅适用于POST和PUT请求。
*/
func RegisterHtml(c *gin.Context) {
	c.HTML(200, "register.html", gin.H{})
}

func Register(c *gin.Context) {
	//新建用户u
	var u DB_operation.UserInfo
	if err := c.ShouldBind(&u); err != nil {
		SendRsp(c, ParamError, nil)
		return
	}
	//加密密码
	if err := u.Encrypt(); err != nil {
		SendRsp(c, PasswdEncryptError, nil)
		return
	}
	//注册
	if err := u.Create(); err != nil {
		SendRsp(c, MysqlError, nil)
		return
	}
	//log.Println("注册成功，用户信息：", u)
	//c.Redirect(301, "/login")
	SendRsp(c, OK, nil)

}

//func LoginHtml(c *gin.Context) {
//	c.HTML(200, "login.html", gin.H{})
//}

// 接受登录信息的结构体
type UserLogin struct {
	UserName string `json:"username" form:"username" binding:"required"`
	Password string `json:"password" form:"password" binding:"required"`
}

func Login(c *gin.Context) {
	// 登录验证
	var userlogin UserLogin
	if err := c.ShouldBindJSON(&userlogin); err != nil {
		SendRsp(c, ParamError, nil)
		fmt.Println(err)
		fmt.Println("这里出错啦")
		return
	}
	u, err := DB_operation.GetUser(userlogin.UserName)
	if err != nil {
		SendRsp(c, NoSuchUser, nil)
		return
	}
	//比较密码是否正确
	if err := DB_operation.Compare(u.UserPassword, userlogin.Password); err != nil {
		SendRsp(c, PasswdError, nil)
		return
	}
	//生成token
	if t, err := token.Sign(token.TokenContext{Id: u.UserId, UserName: u.UserName}, ""); err != nil {
		SendRsp(c, TokenError, nil)
		return
	} else {
		SendRsp(c, OK, t)
	}
	fmt.Println("登录成功")
	c.Redirect(301, "/user/v1/admin")
}

func AdminHtml(c *gin.Context) {
	c.HTML(200, "admin.html", gin.H{})
}

func Comment(c *gin.Context) {
	//用户评论
	jwtid, exists := c.Keys["UserId"].(uint64)
	if !exists {
		SendRsp(c, TokenError, nil) // 假设UnauthorizedError是未授权的错误码
		return
	}
	var commentReq struct {
		Content string `json:"content"`
		// 可以添加其他需要的字段
	}

	if err := c.ShouldBind(&commentReq); err != nil {
		SendRsp(c, CommentError, nil)
		fmt.Println("擦")
		return
	}
	// 创建评论（这里假设DB_operation.CreateComment是处理数据库操作的函数）
	text := DB_operation.Comment{UserId: jwtid, Content: commentReq.Content}
	//if err != nil {
	//	SendRsp(c, ServerError, err) // 假设ServerError是服务器错误的错误码
	//	return
	//}
	fmt.Println("没问题")
	fmt.Println(text.UserId, text.Content)
	c.JSON(200, text.Content)
}

// 搜索接口
func SearchKeywords(c *gin.Context) {
	query := c.Query("query")

	// 查询 IndustryCode
	var industryCodes []DB_operation.IndustryCode
	DB_operation.DB.Self.Where("industry LIKE ?", "%"+query+"%").Find(&industryCodes)

	// 查询 DirectionCode
	var directionCodes []DB_operation.DirectionCode
	DB_operation.DB.Self.Where("direction LIKE ?", "%"+query+"%").Find(&directionCodes)

	// 查询 ProfessionCode
	var professionCodes []DB_operation.ProfessionCode
	DB_operation.DB.Self.Where("profession LIKE ?", "%"+query+"%").Find(&professionCodes)

	// 组合结果
	results := map[string]interface{}{
		"industries":  industryCodes,
		"directions":  directionCodes,
		"professions": professionCodes,
	}
	c.JSON(http.StatusOK, results)
}
